<?php

namespace app\model;

use core\BaseModel;

class User extends BaseModel
{
    protected string $table = 'users';

    /**
     * “设置器”：在设置密码时自动哈希
     *
     * @param string $password
     */
    public function setPasswordAttribute(string $password): void
    {
        // 注意：在我们的模拟环境中，`users` 表的键是 username，
        // 但模型内部的数据结构是 ['id' => ..., 'hash' => ...]。
        // 这里的 `hash` 字段是真实存储密码哈希的地方。
        $this->attributes['hash'] = password_hash($password, PASSWORD_DEFAULT);
    }

    /**
     * 静态方法：通过用户名查找用户
     * @param string $username
     * @return User|null
     */
    public static function findByUsername(string $username): ?User
    {
        // 在我们的 session 结构中, users 表的 key 是 username
        $userData = $_SESSION['users'][$username] ?? null;
        if ($userData) {
            // 将 username 添加到属性中，以便模型实例可以访问
            $userData['username'] = $username;
            return (new static($userData))->syncOriginal();
        }
        return null;
    }

    /**
     * 覆盖 save 方法以适应 session 结构
     */
    public function save(): bool
    {
        // 对于 User 模型，我们使用 username 作为 session 的主键
        if (empty($this->username)) {
            return false; // 用户名是必需的
        }

        if (!$this->exists && !$this->id) { // 创建新用户
            $this->id = $_SESSION['next_user_id']++;
        }

        // 从属性中移除 username，因为它不是存储在值数组中的
        $attributesToSave = $this->attributes;
        unset($attributesToSave['username']);

        $_SESSION['users'][$this->username] = $attributesToSave;
        $this->exists = true;
        return true;
    }
}
